
#include <jni.h>
#include <string>
#include <filesystem>

//native方法实现（写cpp逻辑就可以了）
static jstring myGetString(JNIEnv *env, jclass clazz) {
    return env->NewStringUTF("我是动态注册方式的方法");
}

/**
 *
 * 需要注册的函数列表，放在JNINativeMethod 类型的数组中，以后如果需要增加函数，只需在这里添加就行了
 *参数：
 * 1.java中用native关键字声明的函数名
 * 2.签名（传进来参数类型和返回值类型的说明）
 * 3.C/C++中对应函数的函数名（地址）:只要参数1和参数3一一对应即可
**/
JNINativeMethod getMethods[] = {
        {"getStrFromJNI", "()Ljava/lang/String;", (jstring *) myGetString}
};

//（1）调用RegisterNatives 注册函数
jint registerNatives(JNIEnv *env) {
    jclass pJclass = env->FindClass("com/sjy/jnidemo3/MyJni");
    if (pJclass == NULL) {
        return JNI_ERR;
    }
    return env->RegisterNatives(pJclass, getMethods, sizeof(getMethods) / sizeof(getMethods[0]));
}

//（2）动态注册JNI的模版方法，System.loadLibrary(),会第一个调用该方法
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) {
    jint result = -1;
    JNIEnv *env = NULL;

//获取JNIEnv
    if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
        goto end;
    }
    assert(env != NULL);

//开始动态注册（1） registerNatives ->registerNativeMethods ->env->RegisterNatives
    if (registerNatives(env) < 0) {
        goto end;
    }

//返回jni 的版本
    result = JNI_VERSION_1_6;
//失败处理 默认为-1
    end:
    return result;
}


